# 高阶函数除了可以接受函数作为参数外，还可以把函数作为结果值返回
# 以下函数返回的实际上是一个函数的入口地址


def func(*args):
    result = 0
    for n in args:
        result = result + n
    return result


def sum(*args):
    def func():
        result = 0
        for n in args:
            result = result + n
        return result
    return func


print(func(1, 2, 3), func(1, 2, 3))  # 输出6 6
print(sum(1, 2, 3)(), sum(1, 2, 3)())  # 输出6 6

# 另一个需要注意的问题是，返回的函数并没有立刻执行，而是直到调用了f()才执行


def count_false():
    fs = []
    for i in range(1, 4):
        def f():
            return i * i
        fs.append(f)  # 注意向list里面写入的并不是数，而是同一个函数的入口，因此错误
    return fs  # 等到return的时候，list里面的三个函数都执行的是i=3时，指向同一个地址的函数f的情况


def count_right():
    fs = []

    def f(x):
        def g():
            return x * x
        return g

    for i in range(1, 4):
        fs.append(f(i))  # 此时传递的是f(i)所指向的函数，也就是说i不同，指向不同
    return fs


f1, f2, f3 = count_false()
f4, f5, f6 = count_right()
print(f1(), f2(), f3())  # 输出9 9 9
print(f4(), f5(), f6())  # 输出1 4 9


def func():
    return [1, 2, 3]


a = func()
print(a)
